package com.example.serialportdemo;

import static com.example.serialportdemo.Func.getCRC1;

public class vaccine extends MainActivity{
    // 通信协议包结构: 包头(1) + 版本(1) + 地址(1) + 数据长度(1) + 命令号(1) + 数据(N) + 校验(2) = 7 + N
    static final byte CMMNCT_HEADER=(byte)0xFA;  // 通信数据头
    static final byte CMMNCT_VERSION=0X10;//版本
    static final byte CMMNCT_ADDR=0X02;//地址
    //------------------------------------- 通信协议字段长度分配 -------------------------------------//
    static final int CMMNCT_FRAME_HEADER_LENGTH=5;// 通信结构数据头长度
    static final int CMMNCT_DATA_MAX_LENGTH=20;//通信数据最大长度
    static final int CMMNCT_CHECK_LENGTH=2;//通信校验长度
    static final int CMMNCT_FRAME_MAX_LENGTH=(CMMNCT_FRAME_HEADER_LENGTH + CMMNCT_DATA_MAX_LENGTH + CMMNCT_CHECK_LENGTH);//通信结构最大长度

    static byte[] gCmmnctSendDataBuf=new byte[CMMNCT_FRAME_MAX_LENGTH];

    public static byte[]  CommSendCmd(byte _dictate, int  _data_len, byte[] _databuf) {
        int i;
        gCmmnctSendDataBuf[0] = CMMNCT_HEADER;//包头

        gCmmnctSendDataBuf[1] = CMMNCT_VERSION;//版本

        gCmmnctSendDataBuf[2] = CMMNCT_ADDR;//设备地址

        gCmmnctSendDataBuf[3] = (byte)_data_len;//数据长度

        gCmmnctSendDataBuf[4] = _dictate; //命令码

        //包数据
        if(_data_len>0){
            for(i=0;i<_data_len;i++)
            {
                gCmmnctSendDataBuf[CMMNCT_FRAME_HEADER_LENGTH+i] =  _databuf[i];
            }
        }

        //CRC校验
        i= getCRC1(gCmmnctSendDataBuf,CMMNCT_FRAME_HEADER_LENGTH + _data_len);  //对以上所有数据进行CRC16校验
        gCmmnctSendDataBuf[CMMNCT_FRAME_HEADER_LENGTH+_data_len] = (byte) ((i>>8)&0xFF); //填充CRC16校验值
        gCmmnctSendDataBuf[CMMNCT_FRAME_HEADER_LENGTH+_data_len+1] = (byte) (i&0xFF); //填充CRC16校验值

        //发送数据
        //com.sendData(gCmmnctSendDataBuf,CMMNCT_FRAME_HEADER_LENGTH+_data_len+2);
        return subBytes(gCmmnctSendDataBuf,0,CMMNCT_FRAME_HEADER_LENGTH+_data_len+2);
    }

    public static boolean check_recvData(byte[] _data,int _len){
        if(_len>=8){
            int _dataLength=_data[3];
            if(_len==(7+_dataLength)){
                byte[] byt=new byte[2];
                int CRC16=getCRC1(_data,5 + _dataLength);  //对以上所有数据进行CRC16校验
                byt[0]=(byte) ((CRC16>>8)&0xFF);
                byt[1]=(byte) (byte) (CRC16 &0xFF);
                if((byt[0]==_data[_len-2])&&(byt[1]==_data[_len-1])){
                    return true;
                }
            }
        }
        return false;
    }
    public  static byte[] subBytes(byte[] src, int begin, int count) {
        byte[] bs = new byte[count];
        System.arraycopy(src, begin, bs, 0, count);
        return bs;
    }
}
